{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "73bd968b-d970-4a05-94ef-4e7abf990827",
   "metadata": {},
   "source": [
    "Chapter 11\n",
    "\n",
    "# QR分解\n",
    "Book_4《矩阵力量》 | 鸢尾花书：从加减乘除到机器学习 (第二版)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd98ba2e-2822-45a5-b605-5850aac4ab26",
   "metadata": {},
   "source": [
    "这段代码首先生成了一个随机矩阵 $X$（大小为 $9 \\times 5$），然后对该矩阵进行 QR 分解，包括**完整 QR 分解**和**简化 QR 分解**两种形式，并可视化分解结果。\n",
    "\n",
    "1. **QR 分解**：QR 分解将矩阵 $X$ 表示为正交矩阵 $Q$ 与上三角矩阵 $R$ 的乘积：\n",
    "   \n",
    "   $$\n",
    "   X = Q \\cdot R\n",
    "   $$\n",
    "\n",
    "   - 在**完整版本**中，QR 分解生成的 $Q_{\\text{complete}}$ 为 $9 \\times 9$ 的正交矩阵，$R_{\\text{complete}}$ 为 $9 \\times 5$ 的上三角矩阵。\n",
    "   - 在**简化版本**中，QR 分解生成的 $Q$ 为 $9 \\times 5$ 的矩阵，$R$ 为 $5 \\times 5$ 的上三角矩阵。默认情况下，`np.linalg.qr` 使用这种简化模式。\n",
    "\n",
    "2. **验证 $Q$ 的性质**：对于正交矩阵 $Q$，其转置矩阵与自身相乘应为单位矩阵：\n",
    "\n",
    "   $$\n",
    "   Q^T Q = I\n",
    "   $$\n",
    "\n",
    "   在代码中，通过计算 $Q^T Q$ 验证 $Q$ 的正交性，展示了 $Q$、$Q^T$ 以及 $Q^T Q$ 的结果。\n",
    "\n",
    "3. **可视化**：使用 `seaborn` 的热图展示分解后的矩阵 $X$、$Q$、$R$ 及验证矩阵 $Q^T Q$。这些图形使得每个矩阵及其特性在颜色分布上更直观呈现，以帮助理解 QR 分解过程中矩阵的正交性和上三角结构。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "56e73d69-318d-4046-9889-a7f60a28df17",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np  # 导入数值计算库\n",
    "import seaborn as sns  # 导入数据可视化库\n",
    "from matplotlib import pyplot as plt  # 导入绘图库"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6336fd3e-d094-4cd8-bf1a-b2d4396f100d",
   "metadata": {},
   "source": [
    "## 生成原始数据矩阵 X"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "dc2a246d-e54d-4a25-b4db-8ce06223a64c",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.default_rng()\n",
    "X = np.random.randn(9, 5)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "038cfdf6-d1dd-49c7-823f-c7a0aebcf684",
   "metadata": {},
   "source": [
    "## 完整版 QR 分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "afff8792-1948-41ee-bccf-43930af1bb4e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Rc')"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Sy+9pP/93//lkGREJQ5FRizxeDzq0qWLFi1apF27dpU5sO7atUvr1q3TjTfeqLp168rj8bBhg6iTkZGhrVu36qabbpJ0bG/sqV9envwF0NatW7V69WrNmjUrnGkCYfP8889r/vz5evLJJ3XHHXcoOztbHo9HkydPVlZWVqTTi0rssbVJTk6O1q5dq+nTp6tOnTqly59++mk1b95cffr00ZEjRyKXIGCT2rVrKzMzs0KPknOxACcbMWKELMvSo48+Kr/fH7TO7/frkUcekd/v18CBA5WUlKTOnTvrb3/7m/bv3x+hjAHzsrOzNW/evNK/u3fvrnHjxunTTz9VXl6e5syZowULFsjv92vJkiW68cYbNWDAAJ1//vkRzBqwzznnnKORI0dq8+bNmjt3rpo0aaJRo0bpL3/5i+666y698847+vDDDzVx4kSNGTMm0ulGBwvGbdiwwYqPj7f69u1b5vqVK1dabrfbGjx4cJgzAwDY4Y9//KPlcrmsK6+80pozZ471ySefWHPmzLGysrIsSdbYsWNLn7thwwarVq1a1vnnn29NmzbN+uijj6w333zT6tmzp5Wfnx/BTwFU3YEDB6y6detaM2fOtCzLsg4dOmR169bNkmRJspo3b24NGzbMkmSlpaVZL7zwghUIBCKcNRC6GTNmWJKsNWvWnLbuyJEjVkZGhtW8eXOruLjYsizLmj17ttWuXTsrMTHRqlWrltW6dWtrxowZYc46OnG7HwAADFi5cqVefPFFLV++XPv27VMgEFBiYqLmz59fenhmic2bN2vMmDH66KOPdOjQITVo0EBdunTRlClT5PV6I/QJgNC8/fbbuu+++zRr1ix1795dkrR37179/PPPuuiii3TgwAEdPHhQTZs2lcvlinC2AKINgy0AADaYPXu2evfurccff1zjx4+PdDpAWMyZM0cPP/ywunTpor59++qKK67QOeecowMHDpSeU3vo0CG9//77DLcAjOLiUQAA2OD+++/X7t27NWLECNWsWVNPPvlkpFMCbHfvvfeqQ4cOGjdunPr06aOff/65dF16erp69eqlxx9/nKEWgHHssQUAAIBxgUBA3333nfLy8lS3bl1ucwXAVgy2AAAAAABH43Y/AAAAAABHY7AFAAAAADgagy0AAAAAwNEceVXkWeu+MxIn46E7jcRp8fFHRuIcLQ4YidMwochI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AAi15kpm6m401tyxY8fK5XIFPRo0aFClHL7//nvde++9qlevnmrUqKHLL79c69atq1SMJk2anJaPy+VS//79KxWnuLhYTzzxhJo2baqkpCSdf/75+sMf/qBAIFCpOABwMvpRxfOLxjkg6gbbt956S4MGDdLo0aO1fv16derUSV27dtXOnTsrHKOgoECXXXaZJk2aFFIuy5YtU//+/bVq1SotWbJExcXFys7OVkFBQaXiNGrUSM8995zWrl2rtWvXqkuXLrrtttu0adOmKuW1Zs0aTZs2Tb/61a+q9HoAKGGi5kpm6m601txLLrlEu3fvLn1s3Lix0jEOHDigDh06KD4+XosWLdKXX36pF198UXXq1KlUnDVr1gTlsmTJEknSXXfdVak448eP15QpUzRp0iRt3rxZzz//vHJzczVx4sRKxQGAEvSjionqOcCKMldccYXVr1+/oGUtWrSwRowYUaV4kqwFCxYYyMyy9u7da0myli1bFnKsc845x5o+fXqlX3fo0CGrefPm1pIlS6zOnTtbAwcODDkXALHLdM21LHN1Nxpq7pgxY6zLLrus0u97quHDh1sdO3YMOc6pBg4caF1wwQVWIBCo1Otuvvlmq0+fPkHL7rjjDuvee+81mR6AGEI/OrtonwOiao9tYWGh1q1bp+zs7KDl2dnZWrFiRYSyOiEvL0+SVLdu3SrH8Pv9mjdvngoKCpSVlVXp1/fv318333yzrr/++irnAAASNbciTNTcbdu2qWHDhmratKl69Oih7du3VzrGwoULlZmZqbvuukv169dX69at9ac//anKOUnH/vvPmTNHffr0kcvlqtRrO3bsqA8//FBbt26VJH3++edavny5brrpppByAhCb6EcVE+1zQFykEzBp//798vv9SktLC1qelpamPXv2RCirYyzL0pAhQ9SxY0ddeumllX79xo0blZWVpaNHj6pWrVpasGCBLr744krFmDdvnv79739rzZo1lX5/ADgVNbd8Jmpu+/btNXv2bF144YX68ccf9cwzz+iqq67Spk2bVK9evQrH2b59uyZPnqwhQ4Zo1KhRWr16tX73u9/J6/Xq/vvvr1Ju7777rg4ePKgHHnig0q8dPny48vLy1KJFC3k8Hvn9fj377LPq2bNnlXIBENvoR2cXC3NAVA22JU795tiyrEp/m2zagAED9J///EfLly+v0usvuugibdiwQQcPHtT8+fPVu3dvLVu2rML/sL/77jsNHDhQ77//vhITE6uUAwCUhZp7OlM1t2vXrqW/t2rVSllZWbrgggs0a9YsDRkypMJxAoGAMjMzNW7cOElS69attWnTJk2ePLnKg+2f//xnde3aVQ0bNqz0a9966y3NmTNHc+fO1SWXXKINGzZo0KBBatiwoXr37l2lfACAflS2WJkDomqwTU1NlcfjOe2bmb179572DU44PfbYY1q4cKE++eQTNWrUqEoxEhIS1KxZM0lSZmam1qxZo1deeUVTp06t0OvXrVunvXv3qm3btqXL/H6/PvnkE02aNEk+n08ej6dKuQGITdTcM7Or5tasWVOtWrXStm3bKvW69PT00zaCWrZsqfnz51c6B0n69ttv9cEHH+idd96p0uuHDRumESNGqEePHpKODe3ffvutcnJyGGwBVBr9qHyxMgdE1Tm2CQkJatu2belVGkssWbJEV111VdjzsSxLAwYM0DvvvKOPPvpITZs2NRrb5/NV+PnXXXedNm7cqA0bNpQ+MjMzdc8992jDhg1R8Y8ZQHhRc8/Mrprr8/m0efNmpaenV+p1HTp0OO1WE1u3btV5551XpTxmzJih+vXr6+abb67S6w8fPiy3O3gTxOPxcLsfAFVCPypfrMwBUbXHVpKGDBmi++67T5mZmcrKytK0adO0c+dO9evXr8IxfvnlF3399delf+/YsUMbNmxQ3bp1lZGRUeE4/fv319y5c/X3v/9dtWvXLv0WKSUlRUlJSRWOM2rUKHXt2lWNGzfWoUOHNG/ePC1dulSLFy+ucIzatWufdlx/zZo1Va9evSod7w8AkpmaK5mpu9FYc4cOHapbbrlFGRkZ2rt3r5555hnl5+dXeq/m4MGDddVVV2ncuHHq3r27Vq9erWnTpmnatGmViiMdO6x5xowZ6t27t+LiqrYZccstt+jZZ59VRkaGLrnkEq1fv14vvfSS+vTpU6V4AEA/OrOYmQMiczFme7366qvWeeedZyUkJFht2rSp9KW1P/74Y0vSaY/evXtXKk5ZMSRZM2bMqFScPn36lH6ec88917ruuuus999/v1IxyhKNl/kGEH6h1lzLMlN3o7Hm3n333VZ6eroVHx9vNWzY0LrjjjusTZs2Ven933vvPevSSy+1vF6v1aJFC2vatGlVivN///d/liTr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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Q_complete, R_complete = np.linalg.qr(X, mode='complete')\n",
    "\n",
    "fig, axs = plt.subplots(1, 5, figsize=(12, 3))  # 创建子图\n",
    "\n",
    "plt.sca(axs[0])\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制矩阵 X 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('X')\n",
    "\n",
    "plt.sca(axs[1])\n",
    "plt.title('=')  # 绘制等号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[2])\n",
    "ax = sns.heatmap(Q_complete, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制完整正交矩阵 Qc 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Qc')\n",
    "\n",
    "plt.sca(axs[3])\n",
    "plt.title('@')  # 绘制乘号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[4])\n",
    "ax = sns.heatmap(R_complete, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制上三角矩阵 Rc 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Rc')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8b0a70fa-32b5-4bc4-bbea-b97e4bb27503",
   "metadata": {},
   "source": [
    "## Q 的性质（完整版）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "0cbcfb02-23a0-46f2-a905-283f7e57e991",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Qc')"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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zmby5MnGGGNKSkpMbm6uGTZsmNmyZYvZunWrGTZsmJFknnzySfP444+bRo0anXAf6UWLFpmmTZuaNm3amD/96U9mwYIFZu7cueb66683ksyll14acrupoqIi86Mf/cg0btzY/PGPfzTvvvuu+cc//mHGjBljPvjgg4h+vgCQSBYvXmx+8YtfmJycHON2u40kk5qaav75z3+esO6XX35prr76atO8eXOTkpJicnNzzYgRIypuYbhhwwYjyQwfPrzS16JpRn301ltvmdTUVPPmm29WLPvuu+/MmjVrTDAYNHv37jXffvstzTIaHJv1AbVD0xyheHqTM3XqVNOyZUuzc+dOY4wxS5YsMW3atDGSjMvlMjfeeKPp06ePkWR69+5tlixZUmmcTZs2mdtvv9106NDBJCcnV3yK+8gjj5xwVN2YI5/+3nXXXSY3N9ckJyeb7OxsM2jQIPPVV1/V5EcIAKjEa6+9ZiSZcePGxToVIG789a9/NWlpaWbQoEFmzpw5Zvv27aakpMRs377dzJkzxwwZMsRccsklNM5o0KgPdc9lzNHLIcOKadOmafjw4Ro3bpwmTpxYp68dDAY1ZMgQbdq0SXPnzlVubq6CwaC++eYbZWRkqGXLllq/fr0yMzPVvHnzGsddtWqVzj//fHXt2lXz5s2ruLgZACC6Jk6cqHvvvVcPP/ywfv/738c6HSAubNiwQY899phmzZql77//vmJ5q1atdN1112ncuHHKzs6OYYZA9FEf6hZNcxTE8pf40KFDGjlypP7v//5Po0aN0pAhQ3T66acrOTlZmzdv1rvvvqs///nPuueee/SrX/2qxnEXLlyon/70p+rfv7/+8Y9/cIElAAAQU8FgUFu2bFFhYaGaNWvGrXYARA1NcwM1d+5cPf300/r444/l9/slSW63W927d9eoUaN04403VtxrGQAAAABQOZrmBq64uFhbt26V3+9X27ZtlZGREeuUAAAAAKDeoGkGAAAAAMCBO9YJAAAAAAAQr2iaAQAAAABwkBTrBModfP0RK3GSho61EgeJJZXbaAExtWN/ccQxthaVWshE6niS10qck3Z/aSVOoHGWlTj7vC0ijmHrApKpSXbifLvPZyVO15ObWokDIHw2xn9JarHpYytx9rTvYyVO1sHNVuKsDLSMOEaXjDILmUiu0kNW4hSn27klXGnAzizj7MxG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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 5, figsize=(12, 3))  # 创建子图\n",
    "\n",
    "plt.sca(axs[0])\n",
    "ax = sns.heatmap(Q_complete.T @ Q_complete, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Qc.T @ Qc 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Qc.T@Qc')\n",
    "\n",
    "plt.sca(axs[1])\n",
    "plt.title('=')  # 绘制等号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[2])\n",
    "ax = sns.heatmap(Q_complete.T, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Qc.T 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Qc.T')\n",
    "\n",
    "plt.sca(axs[3])\n",
    "plt.title('@')  # 绘制乘号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[4])\n",
    "ax = sns.heatmap(Q_complete, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Qc 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Qc')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5c662e22-f8a8-495e-b091-79e50fce1ede",
   "metadata": {},
   "source": [
    "## 简化版 QR 分解"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "aaaf4763-e005-4870-aa21-cf12860de16e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'R')"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAEPCAYAAAB2oFgMAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAvjklEQVR4nO3deXwUhf3/8ffuJlnCkXBEYhACfMVyVDxIUBEBBY1Hy1UtKlURFI2CgimHkSqixYBBwAKilkc5ahX9qSh+v0KBEvEALESoiByi0KAWOQ00wCbZnd8fQGBJCCGZI7N5PR+PfSSZmf3MZz0+n/3szM54DMMwBAAAAACAS3mdTgAAAAAAgKpgsAUAAAAAuBqDLQAAAADA1RhsAQAAAACuxmALAAAAAHA1BlsAAAAAgKsx2AIAAAAAXI3BFgAAAADgagy2AAAAAABXY7C1yKBBg+T3+7Vhw4ZS6yZMmCCPx6MPPvjAgcwAAHZYvXq1fvvb3yopKUkxMTFKSkpSv379tGbNGqdTAwAg4jDYWmTq1Kk6//zzNWDAABUVFZUs37Bhg8aOHat7771XPXv2dDBDAIBVpk2bps6dO+v777/X888/r2XLlik7O1s7d+7UVVddpVdffdXpFAHLFBcXa968efrVr36lxo0bKyoqSomJiUpLS9O8efMUDAadThGw1Jw5c+TxeEoeUVFRSkpK0h133KFvvvnG6fQilscwDMPpJCLVsmXLlJaWpieffFLjxo1TUVGROnbsqP3792vDhg2Kj493OkUAgMk+++wzde3aVbfccosWLFigqKioknXFxcXq27evFi1apFWrVqljx44OZgqYb8OGDerXr59++uknDRw4UKmpqWrWrJny8/O1evVqzZs3T+edd57efPNNXXjhhU6nC1hizpw5GjhwoGbPnq02bdro6NGj+uyzzzR+/HjVq1dPmzdvVoMGDZxOM+Iw2Frs4Ycf1p///GetXr1a7777rp577jktWbJEN9xwg9OpAQAs8Otf/1qLFy/Wjh071LRp01Lrd+7cqZYtW6pXr1569913HcgQsMbGjRt19dVXq3///po0aZLq1KlTapsjR47oscce06JFi7Ry5UpdcMEFDmQKWOvEYLtmzRqlpqaWLH/mmWc0duxY/eUvf9HAgQMdzDAycSqyxbKzs5WcnKzbbrtNEydOVHp6OkMtIpphGCouLq7QA4g0wWBQOTk5Sk1NLXOolaRmzZopJSVFy5YtUygUsjlDwBrBYFD9+vXTfffdp5kzZ5Y51BqGoZiYGL388svq1q2b0tPTHcgUcM6JIfenn35yOJPIxGBrsTp16uiPf/yjduzYofPOO0/Z2dlOpwRYasWKFYqOjq7QY8eOHU6nC5hq7969Onz4sFq2bFnudi1bttShQ4e0f/9+mzIDrDV//nwVFBRowoQJkqRQKKRnnnlGF1xwgWJjY3Xrrbdq0qRJ6tGjhyRpypQpWrZsmbZt2+Zk2oCttm/fLkn6xS9+4XAmkSnq7JugKkKhkKZNmyav16vdu3frX//6lzp37ux0WoBlUlJSKnzV1yZNmlicDVA9nfgWkMfjcTgTwBzvvfee7r33XsXExEiSpk+frueff17PPfec2rdvrwULFujJJ5/UVVddJUlq1KiROnXqpJycHLVq1crJ1AHLBINBFRcXl3zH9o9//KO6du2qXr16OZ1aRGKwtdikSZO0atUqzZ8/X2PHjtWgQYO0fv16xcbGOp0aYIm6devqsssuq9C2p15UB4gECQkJql27dsmn8meyY8cOxcbGqlGjRjZlBlhr69atuvPOO0v+fuWVV5SZmalHH31UknTdddfpq6++Cjv9PjExUXv27LE9V8AuJz7IOaFt27Z6//33ef9jEU5FttDXX3+tp556Svfcc49uv/12zZkzR9u2bdOYMWOcTg2wDKcioybz+Xzq3r271q5dq++//77Mbb7//nvl5uaqe/fuNmcHWKeoqEi1atUq+Xv79u3q0KFD2DanXwX8+++/V0JCgi35AU6YN2+e1qxZo+XLl+vBBx/Upk2bwj4Agrn4uMAixcXFGjBggBISEvTiiy9KOvapTUZGhiZPnqxbb72VU5IRkTgVGTXd448/rg8//FAPP/ywFixYIJ/PV7IuGAzqoYceUjAY1LBhwxzMEjBXcnKytm7dqltuuUXSsaOxp394eeqZDFu3btU///lPzZ071840AVu1bdu25IJR1113nYLBoGbNmqW3335bt912m8PZRR5u92ORZ599Vk899ZQWLVqkm266qWT50aNHddlll8kwDE5JBoAINW3aNA0bNkxXXnmlhg4dquTkZOXl5WnGjBlatWqVnn76aY0dO9bpNAHTTJ48WW+99ZZWr14tSRo9erRef/11vf7667rk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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Q, R = np.linalg.qr(X)\n",
    "\n",
    "fig, axs = plt.subplots(1, 5, figsize=(12, 3))  # 创建子图\n",
    "\n",
    "plt.sca(axs[0])\n",
    "ax = sns.heatmap(X, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制矩阵 X 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('X')\n",
    "\n",
    "plt.sca(axs[1])\n",
    "plt.title('=')  # 绘制等号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[2])\n",
    "ax = sns.heatmap(Q, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制简化正交矩阵 Q 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Q')\n",
    "\n",
    "plt.sca(axs[3])\n",
    "plt.title('@')  # 绘制乘号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[4])\n",
    "ax = sns.heatmap(R, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制上三角矩阵 R 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('R')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3445afb4-ca5c-4684-85e3-54aaf6b9beea",
   "metadata": {},
   "source": [
    "## Q 的性质（简化版）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "41821e4f-02cb-4818-bacc-a2a4d2079f49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, 'Q')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA80AAAEPCAYAAAB4CSZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA7m0lEQVR4nO3de3gU5dnH8d9mk2xCgCCJxCAEUKqAIGqCyJmixIJFxSqeQWm1AaQc5ChaQMGAqNByEqQNUFS0FSzqCyVIABUoEPHEQUDQgHIUCBrCkuzO+wewZUk2x9mdZPP9XNdeZGdm77k3mueZe+aZeWyGYRgCAAAAAAAFhFidAAAAAAAAFRVFMwAAAAAAPlA0AwAAAADgA0UzAAAAAAA+UDQDAAAAAOADRTMAAAAAAD5QNAMAAAAA4ANFMwAAAAAAPlA0AwAAAADgA0UzAAAAAFQiGzdu1H333af4+HiFh4crPj5evXr10ubNm61OLShRNAMAAKDSyM/P18KFC3XHHXeoTp06Cg0NVVxcnJKTk7Vw4UK5XC6rUwT8avr06WrXrp0OHDigl156SatWrdKUKVO0f/9+3XLLLZo7d67VKQYdiuYAKOuZoM6dO8tmsxX7GjdunKn57tixQ4899pgSEhLkcDh0+eWX67e//a1Wrlxp6n4AAABK46uvvlKLFi00ePBgNWnSRH/5y1+0Zs0a/f3vf1fr1q313HPPqXXr1vr222+tThXwi08//VSDBw9W9+7d9fHHH+vRRx9Vx44d9cgjj+jjjz9W9+7d1b9/f644m8xmGIZhdRLBbPr06Ro8eLBuvvlm9e/fXw0aNFBWVpZmzpypTZs2afbs2XryyScL/ez27dt16tQpz/sPP/xQEyZMUFpampo0aeJZXq9ePdWrV8/rs7t379asWbO0cuVK7du3T4ZhKCEhQXfccYdSUlJ0zTXXFLrPJUuW6KGHHtJVV12lIUOG6Nprr9Xhw4eVlpam5cuX69lnn9ULL7xgwm8GAACg5LZt26a2bdvqoYce0ssvv6yoqKgC2+Tm5mrIkCFavny51q9fryuvvNKCTAH/+e1vf6sVK1bou+++K3D8L0n79+9Xo0aNdOedd2rJkiUWZBicKJr96NNPP1XHjh3VvXt3LV26VKGhoZ51+fn56tmzp5YvX64NGzaoVatWxcabP3++Hn/8cW3evFlJSUmFbuN2u/Xcc89p8uTJatu2re6//35dffXVqlatmvbu3at///vfWrFihcaPH68RI0Z4ffbbb7/V9ddfr2bNmmnNmjUFOqN+/frptdde05IlS9SzZ88y/EaA8jMMo8RD7y7+mwMAVF4ul0vXX3+9br/9dr366quFbmMYhtxut+x2u3r37q0TJ07o/fffD3CmgP+4XC7VrFlTLVq00MaNG31u17p1a+3YsUMnT55USAgDi83Ab9GPUlNTZbPZNHv27AIH76GhoZo1a5ZnO7M88cQTmj9/vjIyMrRu3ToNGDBAv/nNb9SxY0c99thjWrp0qT766CO9+uqrmjBhgtdnp06dqtOnT2v69OmFnr195ZVXVKtWLa40w1Jr165VWFhYiV7fffed1ekCAEywePFi5eTkaNKkSZLOXSR4/vnndeWVVyoyMlK/+93v9PLLL+vWW2+VdO6YZtWqVdqzZ4+VaQOmOnbsmE6fPq1GjRoVuV2jRo30888/6/jx4wHKLPhxGcZPXC6XMjIylJSUVOjQCUmqX7++EhMTtWrVKrnd7nKfCXrzzTe1dOlSffbZZ2rYsKHPvNq0aaNVq1bplltu0e233+65yp2enq64uDjdcssthX62WrVqSk5O1jvvvKMjR46oTp065coXKIvExMQS36dTt25dP2cDAAiE9957T4899pjCw8MlSTNmzNBLL72kF198US1atNDSpUv13HPPeY5hYmJi1KZNG2VkZKhx48ZWpg4E3IWBxDabzeJMggdFs5+U5kzQpk2bdPz4ccXGxpZrn+PGjdOkSZM8BfP27duVkpKiTZs2KT4+Xi+88IKeffZZzZ8/X507d1a/fv3017/+Vf/4xz8kSVlZWbrhhhuKzffCthTNsEL16tWL/f/0AoZnA0Bw2LVrlx588EHP+zlz5mj06NH605/+JEn69a9/ra+//lput9uzTVxcnI4ePRrwXAF/iY2NVbVq1bRv374it/vuu+8UGRmpmJiYAGUW/BiebTGzzgRt27ZNP/zwgx5++GFJ5x6EcfvttysyMlLLli3TpEmTNHbsWP3444+ez/To0UOrV6+2JF+grBieDQBVT15eniIiIjzv9+3bp5tuuslrm0ufD3PgwIFyX5AAKhK73a4uXbpoy5YtOnDgQKHbHDhwQJmZmerSpUuAswtuXIbxk0CfCdq1a5euvvpqz73IH3zwgX755Re9++67ql69uiQpPj5enTp18nzm0jOwCQkJJcpXOje0HLACw7MBoOpJSEjQrl271L17d0nnjmEuPTF68THMrl27tGnTJi1YsCCQaQJ+N2rUKP3f//2f+vfvr6VLl8put3vWuVwu9evXTy6XS4MGDbIwy+BD0ewnF84ELV++XAcOHCj0vuYLZ4J+85vflHt/hZ2BveaaazwFs1T8Gdjk5GTNmDFDGzduLPS+5tOnTys9PV3XXXcdQ7NhmRo1avh8ejwAIDglJydr8eLFGjx4sCSpV69eevHFF9W8eXNdf/31ev/997V06VLdcsstSk9P1x//+Ec99dRTuuqqq6xNHDBZu3btNG3aNA0aNEjt27fXU089pYSEBM+Uths2bNC4cePUtWtXq1MNKgzP9qNRo0bJMAz179+/wBQ5Zp8JSkhI0LfffuvZT1xcnPbv3++130uvIs+fP1+333675/3gwYNVrVo1DRw4UDk5OQX2MWzYMJ04ccLTYQEAAARC3759tXv3bs+V4+eee05JSUnq2LGjatWqpeeff15DhgzRJ598okcffVQDBgzQyy+/bHHWgH8MHDhQn376qa688ko9/fTT6ty5sx555BFt3bpVH374ocaOHWt1isHHgF/99a9/NWw2m3HLLbcYixYtMtatW2csWrTIaNOmjSHJGDdunGfbNWvWGHa73Rg/fnyhsdLS0gxJxubNmwusy8vLM2rXrm0sX77cMAzDOHz4sFGjRg1j0KBBxuHDh409e/YYnTt3NiQZixYtMp5++mkjJibG2Ldvn1ecf/3rX4bD4TCaNm1qvP7668a6deuMf/7zn0a3bt0MScbjjz9u3i8HAACghP75z38aERERxttvv+1ZdvjwYWPHjh2G2+02fvrpJ+Pbb7813G63hVkC1liwYIEhyRgxYoTVqQQlhmf72cCBA5WUlKRXXnlFTz/9tI4ePSq3262IiAh9+OGHnntzpHMP2XK5XF5Pfiyp0NBQ/elPf9Lw4cPVoUMH1alTR2+++aZ69+6tv/zlL7Lb7Ro+fLj27dun3r1767bbbtP69esLTE31u9/9Tk2aNNFLL72k8ePH69ChQ8rPz5fNZtPf/vY39e3bt7y/EgAAgFK79957debMGT322GNauHChnnjiCd18881q2LChDh065LmH+eeff9bKlSt5aCmqlN69e+vgwYMaNWqUoqKi9Oc//9nqlIKKzTDOPw4ZAbNw4UL16dNHI0aM0OTJk02Lm5ubq86dO6tGjRp65513VLt2beXn52v37t2Ki4tT7dq1tWvXLsXFxSk6OrrEcT/66CN1795d99xzj954441yzycNAABQVvv27dOLL76oJUuW6Pjx457l8fHxeuihhzRixAievQLAVBTNFpk8ebJGjRql8ePHm3om6NixY+rVq5e2bdumQYMG6be//a1nbuW9e/fqgw8+UFpamubMmaNbb721xHHfeustPfzww+rbt69ef/11zt4CAABLud1u7d+/X9nZ2apdu3ahD10FADNQNAcht9utRYsWafr06crMzPTMrRwaGqr27dtryJAhuvPOOy3OEgAAAAAqPormIJedna0ff/xRktSgQQNVq1bN4owAAAAAoPKgaAYAAAAAwAee6AQAAAAAgA9MOQUAAAAAkg6ezDElzuXff2pKnGMN25kSJ/aXrHLH2Oq6woRMpFYJl5kSJ5AqTNH8yxvPW7r/0HuGW7p/WCsiMtLqFAAAAABUQAzPBgAAAADAB4pmAAAAAAB8oGgGAAAAAMAHimYAAAAAAHygaAYAAAAAwIcK8/RsAAAAACiJAwcOaPbs2Vq/fr0OHTokm82muLg4tW3bVikpKapfv77VKSKIUDQDAAAAqDQ++eQTdevWTfXr11dycrKSk5NlGIaOHDmi9957T9OnT9fy5cvVrl3Rcxw7nU45nc5LluXL4XD4M31UQhTNAAAAACqNIUOG6A9/+IOmTp3qc/3gwYO1efPmIuOkpqZq/PjxXsuGjhytYaPGmJYrgoPNMAzD6iQk6Zc3nrd0/6H3DLd0/7BWRGSk1SkAAACgBCIjI/X555/r2muvLXT9zp07deONNyo3N7fIOIVdaT6ea86V5su//7TcMSTpWMOir5aXVOwvWeWOsdV1hQmZSK0SLjMlTiBxpRkAAABApREfH6/169f7LJo3bNig+Pj4YuM4HI4CBXKOO8eUHBFcKJoBAAAAVBrDhg1TSkqKMjMz1bVrV8XFxclms+nQoUNKT0/XvHnzNG3aNKvTRBChaAYAAABQafTv318xMTGaOnWq5syZI5fLJUmy2+1KTEzUwoUL1atXL4uzRDChaAYAAABQqdx///26//77lZeXp2PHjkmSYmNjFRYWZnFmCEalLpqZEw0AAABARRAW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",
      "text/plain": [
       "<Figure size 1200x300 with 8 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, axs = plt.subplots(1, 5, figsize=(12, 3))  # 创建子图\n",
    "\n",
    "plt.sca(axs[0])\n",
    "ax = sns.heatmap(Q.T @ Q, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Q.T @ Q 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Q.T@Q')\n",
    "\n",
    "plt.sca(axs[1])\n",
    "plt.title('=')  # 绘制等号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[2])\n",
    "ax = sns.heatmap(Q.T, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Q.T 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Q.T')\n",
    "\n",
    "plt.sca(axs[3])\n",
    "plt.title('@')  # 绘制乘号\n",
    "plt.axis('off')\n",
    "\n",
    "plt.sca(axs[4])\n",
    "ax = sns.heatmap(Q, cmap='RdBu_r', vmax=2.5, vmin=-2.5,  # 绘制 Q 的热图\n",
    "                 cbar_kws={\"orientation\": \"horizontal\"})\n",
    "ax.set_aspect(\"equal\")\n",
    "plt.title('Q')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "85a80909-2aac-49ed-bb7a-f8cc6b80ee7d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ecd322f4-f919-4be2-adc3-69d28ef25e69",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
